<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>天气案例_深度监视</title>
    <!-- 引入Vue.js -->
    <script src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 准备好一个容器 -->
    <div id="root">
      <h2>今天天气很{{weather}}</h2>
      <button @click="changeWeather">切换天气</button>
      <hr />
      <h3>a的值是{{numbers.a}}</h3>
      <button @click="numbers.a++">点我让a+1</button>
      <h3>b的值是{{numbers.b}}</h3>
      <button @click="numbers.b++">点我让b+1</button>
      <button @click="numbers = {a:666,b:888}">彻底替换掉 numbers</button>
      <!-- <h3>c多及结构下的c的值为{{numbers.c.d.e}}</h3> -->
      <button @click="numbers.c.d.e++">点我让e+1</button>
      <!-- Vue 自身可以监视到对象内部值的变化,当值发生变化时会自动更新模板里的内容 -->
    </div>
  </body>
  <script>
    const vm = new Vue({
      el: "#root",
      data() {
        return {
          isHot: true,
          numbers: {
            // 多级结构的属性
            a: 1,
            b: 1,
            c:{
              d:{
                e:100
              }
            }
          },
        };
      },
      // 计算属性
      computed: {
        weather() {
          return this.isHot ? "炎热" : "凉爽";
        },
      },
      // 方法
      methods: {
        changeWeather() {
          this.isHot = !this.isHot;
        },
      },
      // 监视属性
      watch: {
        isHot: {
          // isHot：要被监视的属性名
          // immediate: true, // 初始化时让 handler 调用一下
          // handler什么时候调用? 当isHot发生改变时
          handler(newValue, oldValue) {
            // handler有两个参数 newValue:修改后的值,oldValue:修改前的值
            console.log(`天气变化为:${newValue},之前的天气为:${oldValue}`);
          },
        },
        // 监视多级结构中某个属性的变化
        "numbers.a": {
          //对象的键值为字符串
          handler(newValue, oldValue) {
            console.log(`a变化为:${newValue},之前的a为:${oldValue}`);
          },
        },
        // 监视多级结构中的所有属性的变化
        numbers: {
          deep: true, // 开启深度监视
          handler() {
            console.log("numbers发生了变化");
          },
        },
      },
    });
  </script>
</html>
